์๋น์ค ์์ปค ํ์ ๊ฐ๋ก์ฑ๊ธฐ์ ์ธ๊ณ๋ฅผ ํํํ๊ณ , ํ์ด์ง ๋ก๋ ๋ฉ์ปค๋์ฆ์ ์ดํดํ๋ฉฐ, ์คํ๋ผ์ธ ์ฐ์ , ์ฑ๋ฅ ์ต์ ํ, ๊ทธ๋ฆฌ๊ณ ์ ์ธ๊ณ ์ฌ์ฉ์ ๊ฒฝํ ํฅ์์ ๊ฐ๋ ฅํ ํ์ ๋ฐํํด ๋ณด์ธ์.
ํ๋ก ํธ์๋ ์๋น์ค ์์ปค ํ์: ํ์ด์ง ๋ก๋ ๊ฐ๋ก์ฑ๊ธฐ๋ฅผ ํตํ ์ด๊ณ ์ ์น ๊ฒฝํ ๋ง์คํฐํ๊ธฐ
์ค๋๋ ์ํธ ์ฐ๊ฒฐ๋ ๋์งํธ ํ๊ฒฝ์์ ์น ์ฑ๋ฅ์ ๋ํ ์ฌ์ฉ์ ๊ธฐ๋์น๋ ๊ทธ ์ด๋ ๋๋ณด๋ค ๋์ต๋๋ค. ๋๋ฆฌ๊ฒ ๋ก๋ฉ๋๋ ์น์ฌ์ดํธ๋ ์ง๋ฆฌ์ ์์น๋ ๋คํธ์ํฌ ์กฐ๊ฑด์ ๊ด๊ณ์์ด ์ฐธ์ฌ๋ ํ๋ฝ, ์ ํ์จ ๊ฐ์, ๊ทธ๋ฆฌ๊ณ ์ฌ์ฉ์์๊ฒ ์ค๋ง์ค๋ฌ์ด ๊ฒฝํ์ ์๋ฏธํ ์ ์์ต๋๋ค. ๋ฐ๋ก ์ด ์ง์ ์์ ํ๋ก ํธ์๋ ์๋น์ค ์์ปค ํ์ ๊ฐ๋ก์ฑ๊ธฐ์ ํ์ด ์ง์ ์ผ๋ก ๋น์ ๋ฐํ๋ฉฐ, ์น ํ์ด์ง๊ฐ ๋ก๋๋๊ณ ๋์ํ๋ ๋ฐฉ์์ ๋ํ ํ์ ์ ์ธ ์ ๊ทผ๋ฒ์ ์ ๊ณตํฉ๋๋ค. ๋คํธ์ํฌ ์์ฒญ, ํนํ ํ์ด์ง ํ์ ์์ฒญ์ ๊ฐ๋ก์ฑ์ผ๋ก์จ ์๋น์ค ์์ปค๋ ๊ฐ๋ฐ์๊ฐ ๊น๋ค๋ก์ด ์คํ๋ผ์ธ ๋๋ ์ ์ฐ๊ฒฐ์ฑ ํ๊ฒฝ์์๋ ๋ฒ๊ฐ์ฒ๋ผ ๋น ๋ฅด๊ณ , ๋์ ๋ณต์๋ ฅ์ ๊ฐ์ง๋ฉฐ, ๊น์ด ๋ชฐ์ ํ ์ ์๋ ์ฌ์ฉ์ ๊ฒฝํ์ ์ ๊ณตํ ์ ์๊ฒ ํด์ค๋๋ค.
์ด ์ข ํฉ ๊ฐ์ด๋๋ ์๋น์ค ์์ปค ํ์ ๊ฐ๋ก์ฑ๊ธฐ์ ๋ณต์กํ ์ธ๊ณ๋ฅผ ๊น์ด ํ๊ณ ๋ญ๋๋ค. ์ฐ๋ฆฌ๋ ๊ทธ ํต์ฌ ๋ฉ์ปค๋์ฆ, ์ค์ ์ ์ฉ ์ฌ๋ก, ๊ทธ๊ฒ์ด ์ ๊ณตํ๋ ์ฌ์คํ ์ด์ , ๊ทธ๋ฆฌ๊ณ ๊ธ๋ก๋ฒ ์ปจํ ์คํธ์์ ํจ๊ณผ์ ์ผ๋ก ๊ตฌํํ๊ธฐ ์ํ ์ค์ํ ๊ณ ๋ ค ์ฌํญ๋ค์ ํ๊ตฌํ ๊ฒ์ ๋๋ค. ํ๋ก๊ทธ๋ ์๋ธ ์น ์ฑ(PWA)์ ๊ตฌ์ถํ๊ฑฐ๋, ๊ธฐ์กด ์ฌ์ดํธ์ ์๋๋ฅผ ์ต์ ํํ๊ฑฐ๋, ๊ฐ๋ ฅํ ์คํ๋ผ์ธ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ ค๋ ๋ชฉํ๋ฅผ ๊ฐ์ง๊ณ ์๋ค๋ฉด, ํ์ ๊ฐ๋ก์ฑ๊ธฐ๋ฅผ ์ดํดํ๋ ๊ฒ์ ํ๋ ํ๋ก ํธ์๋ ๊ฐ๋ฐ์ ์์ด ํ์์ ์ธ ๊ธฐ์ ์ ๋๋ค.
์๋น์ค ์์ปค ์ดํดํ๊ธฐ: ๊ฐ๋ก์ฑ๊ธฐ์ ๊ธฐ์ด
ํ์ ๊ฐ๋ก์ฑ๊ธฐ์ ๋ํด ๊ตฌ์ฒด์ ์ผ๋ก ์์๋ณด๊ธฐ ์ ์, ์๋น์ค ์์ปค์ ๊ทผ๋ณธ์ ์ธ ํน์ฑ์ ํ์ ํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค. ์๋น์ค ์์ปค๋ ๋ธ๋ผ์ฐ์ ๊ฐ ๋ฉ์ธ ๋ธ๋ผ์ฐ์ ์ค๋ ๋์ ๋ณ๊ฐ๋ก ๋ฐฑ๊ทธ๋ผ์ด๋์์ ์คํํ๋ JavaScript ํ์ผ์ ๋๋ค. ์ด๋ ์น ํ์ด์ง์ ๋คํธ์ํฌ ์ฌ์ด์ ํ๋ก๊ทธ๋๋ฐ ๊ฐ๋ฅํ ํ๋ก์ ์ญํ ์ ํ์ฌ ๋คํธ์ํฌ ์์ฒญ, ์บ์ฑ, ์ฌ์ง์ด ํธ์ ์๋ฆผ๊น์ง ์์ฒญ๋ ์ ์ด๊ถ์ ๋ถ์ฌํฉ๋๋ค.
๊ธฐ์กด์ ๋ธ๋ผ์ฐ์ ์คํฌ๋ฆฝํธ์ ๋ฌ๋ฆฌ, ์๋น์ค ์์ปค๋ DOM์ ์ง์ ์ ๊ทผํ ์ ์์ต๋๋ค. ๋์ , ๋ค๋ฅธ ์ฐจ์์์ ์๋ํ์ฌ ํ์ด์ง๊ฐ ๋ง๋ ์์ฒญ์ ๊ฐ๋ก์ฑ๊ณ , ํด๋น ์์ฒญ์ ์ฒ๋ฆฌํ๋ ๋ฐฉ๋ฒ์ ๊ฒฐ์ ํ๋ฉฐ, ์ฌ์ง์ด ์๋ต์ ํฉ์ฑํ ์๋ ์์ต๋๋ค. ์ด๋ฌํ ๋ถ๋ฆฌ๋ ์๋น์ค ์์ปค์ ๊ฐ๋ ฅํจ๊ณผ ๋ณต์๋ ฅ์ ๋งค์ฐ ์ค์ํฉ๋๋ค. ๋ฉ์ธ ํ์ด์ง๊ฐ ๋ซํ๊ฑฐ๋ ์ฌ์ฉ์๊ฐ ์คํ๋ผ์ธ ์ํ์ผ ๋๋ ๊ณ์ํด์ ์๋ํ ์ ์๊ธฐ ๋๋ฌธ์ ๋๋ค.
์๋น์ค ์์ปค์ ์ฃผ์ ํน์ง์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
- ์ด๋ฒคํธ ๊ธฐ๋ฐ:
install,activate, ๊ทธ๋ฆฌ๊ณ ์ฐ๋ฆฌ ์ฃผ์ ์ ๊ฐ์ฅ ์ค์ํfetch์ ๊ฐ์ ํน์ ์ด๋ฒคํธ์ ์๋ตํฉ๋๋ค. - ํ๋ก๊ทธ๋๋ฐ ๊ฐ๋ฅํ ๋คํธ์ํฌ ํ๋ก์: ๋ธ๋ผ์ฐ์ ์ ๋คํธ์ํฌ ์ฌ์ด์ ์์นํ์ฌ ์์ฒญ์ ๊ฐ๋ก์ฑ๊ณ ํ์์ ๋ฐ๋ผ ์บ์๋ ์ฝํ ์ธ ๋ฅผ ์ ๊ณตํ๊ฑฐ๋ ๋คํธ์ํฌ์์ ๊ฐ์ ธ์ต๋๋ค.
- ๋น๋๊ธฐ์ : ๋ชจ๋ ์์ ์ ๋ ผ๋ธ๋กํน(non-blocking)์ผ๋ก, ์ํํ ์ฌ์ฉ์ ๊ฒฝํ์ ๋ณด์ฅํฉ๋๋ค.
- ์๊ตฌ์ : ์ผ๋จ ์ค์น๋๋ฉด, ์ฌ์ฉ์๊ฐ ํญ์ ๋ซ์ ํ์๋ ๋ช ์์ ์ผ๋ก ๋ฑ๋ก ํด์ ๋๊ฑฐ๋ ์ ๋ฐ์ดํธ๋ ๋๊น์ง ํ์ฑ ์ํ๋ฅผ ์ ์งํฉ๋๋ค.
- ๋ณด์: ์๋น์ค ์์ปค๋ HTTPS ์์์๋ง ์คํ๋์ด ๊ฐ๋ก์ฑ ์ฝํ ์ธ ๊ฐ ๋ณ์กฐ๋์ง ์๋๋ก ๋ณด์ฅํฉ๋๋ค. ์ด๋ ์ค๊ฐ์ ๊ณต๊ฒฉ์ ๋ฐฉ์งํ๊ธฐ ์ํ ์ค์ํ ๋ณด์ ์กฐ์น์ด๋ฉฐ, ํนํ ๋ฏผ๊ฐํ ๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌํ๋ ๊ธ๋ก๋ฒ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ค์ํฉ๋๋ค.
์๋น์ค ์์ปค๊ฐ fetch ์ด๋ฒคํธ๋ฅผ ๊ฐ๋ก์ฑ ์ ์๋ ๋ฅ๋ ฅ์ ํ์ ๊ฐ๋ก์ฑ๊ธฐ์ ์ด์์
๋๋ค. ์ด ๊ธฐ๋ฅ์ด ์๋ค๋ฉด, ์๋น์ค ์์ปค๋ ๋จ์ง ๋ฐฑ๊ทธ๋ผ์ด๋ ๋๊ธฐํ๋ ํธ์ ์๋ฆผ ํธ๋ค๋ฌ์ ๋ถ๊ณผํ ๊ฒ์
๋๋ค. ์ด ๊ธฐ๋ฅ ๋๋ถ์ ์๋น์ค ์์ปค๋ ์ด๊ธฐ ํ์ด์ง ๋ก๋๋ถํฐ ํ์ ๋ฆฌ์์ค ์์ฒญ์ ์ด๋ฅด๊ธฐ๊น์ง ์ ์ฒด ์น ๋ธ๋ผ์ฐ์ง ๊ฒฝํ์ ์ ์ดํ๋ ๊ฐ๋ ฅํ ๋๊ตฌ๋ก ๋ณ๋ชจํฉ๋๋ค.
ํ์ด์ง ๋ก๋๋ฅผ ์ํ ํ์ ๊ฐ๋ก์ฑ๊ธฐ์ ํ
ํ์ ๊ฐ๋ก์ฑ๊ธฐ๋ ๋ณธ์ง์ ์ผ๋ก ์ฌ์ฉ์๊ฐ ์ฃผ์์ฐฝ์ URL์ ์ ๋ ฅํ๊ฑฐ๋, ๋งํฌ๋ฅผ ํด๋ฆญํ๊ฑฐ๋, ์์์ ์ ์ถํ์ฌ ์๋ก์ด URL๋ก ์ด๋ํ ๋ ๋ธ๋ผ์ฐ์ ๊ฐ ์์ฑํ๋ ์์ฒญ์ ์๋น์ค ์์ปค๊ฐ ๊ฐ๋ก์ฑ ์ ์๋ ๋ฅ๋ ฅ์ ์๋ฏธํฉ๋๋ค. ๋ธ๋ผ์ฐ์ ๊ฐ ๋คํธ์ํฌ์์ ์ง์ ์ ํ์ด์ง๋ฅผ ๊ฐ์ ธ์ค๋ ๋์ , ์๋น์ค ์์ปค๊ฐ ๊ฐ์ ํ์ฌ ํด๋น ์์ฒญ์ ์ด๋ป๊ฒ ์ฒ๋ฆฌํ ์ง ๊ฒฐ์ ํฉ๋๋ค. ์ด ๊ฐ๋ก์ฑ๊ธฐ ๊ธฐ๋ฅ์ ์๋ง์ ์ฑ๋ฅ ๋ฐ ์ฌ์ฉ์ ๊ฒฝํ ํฅ์์ ๊ฐ๋ฅํ๊ฒ ํฉ๋๋ค:
- ์ฆ๊ฐ์ ์ธ ํ์ด์ง ๋ก๋: ์บ์๋ HTML ๋ฐ ๊ด๋ จ ์์ฐ์ ์ ๊ณตํจ์ผ๋ก์จ, ์๋น์ค ์์ปค๋ ๋คํธ์ํฌ๊ฐ ๋๋ฆฌ๊ฑฐ๋ ์ฌ์ฉ ๋ถ๊ฐ๋ฅํ ๊ฒฝ์ฐ์๋ ํ์ด์ง ์ฌ๋ฐฉ๋ฌธ์ ์ฆ๊ฐ์ ์ผ๋ก ๋๋ผ๊ฒ ํ ์ ์์ต๋๋ค.
- ์คํ๋ผ์ธ ๊ธฐ๋ฅ: "์คํ๋ผ์ธ ์ฐ์ " ๊ฒฝํ์ ๊ฐ๋ฅํ๊ฒ ํ๋ ์ฃผ์ ๋ฉ์ปค๋์ฆ์ผ๋ก, ์ฌ์ฉ์๊ฐ ์ธํฐ๋ท ์ฐ๊ฒฐ ์์ด๋ ํต์ฌ ์ฝํ ์ธ ์ ๊ธฐ๋ฅ์ ์ ๊ทผํ ์ ์๊ฒ ํฉ๋๋ค. ์ด๋ ๋คํธ์ํฌ ์ธํ๋ผ๊ฐ ๋ถ์์ ํ ์ง์ญ์ด๋ ์ด๋ ์ค์ธ ์ฌ์ฉ์์๊ฒ ํนํ ์ ์ฉํฉ๋๋ค.
- ์ต์ ํ๋ ๋ฆฌ์์ค ์ ๋ฌ: ์๋น์ค ์์ปค๋ ์ ๊ตํ ์บ์ฑ ์ ๋ต์ ์ ์ฉํ์ฌ ์์ฐ์ ํจ์จ์ ์ผ๋ก ์ ๋ฌํ๊ณ , ๋์ญํญ ์๋น๋ฅผ ์ค์ด๋ฉฐ ๋ก๋ ์๊ฐ์ ๊ฐ์ ํ ์ ์์ต๋๋ค.
- ๋ณต์๋ ฅ: ์๋น์ค ์์ปค๋ ๊ฐ๋ ฅํ ๋์ฒด ๋ฉ์ปค๋์ฆ์ ์ ๊ณตํ์ฌ, ๋๋ ค์ด "์คํ๋ผ์ธ์ ๋๋ค" ํ์ด์ง๋ฅผ ๋ฐฉ์งํ๊ณ ๋์ ์ฐ์ํ๊ฒ ๊ธฐ๋ฅ์ด ์ ํ๋ ๊ฒฝํ์ด๋ ์บ์๋ ์ฝํ ์ธ ๋ฅผ ์ ๊ณตํฉ๋๋ค.
- ํฅ์๋ ์ฌ์ฉ์ ๊ฒฝํ: ์๋๋ฅผ ๋์ด์, ๊ฐ๋ก์ฑ๊ธฐ๋ ์ปค์คํ ๋ก๋ฉ ํ์๊ธฐ, ์ฌ์ ๋ ๋๋ง, ๊ทธ๋ฆฌ๊ณ ํ์ด์ง ๊ฐ์ ๋ถ๋๋ฌ์ด ์ ํ์ ๊ฐ๋ฅํ๊ฒ ํ์ฌ ์น์ ๋ค์ดํฐ๋ธ ์ ํ๋ฆฌ์ผ์ด์ ์ฒ๋ผ ๋๋ผ๊ฒ ๋ง๋ญ๋๋ค.
๊ฐํ์ ์ธ ์ธํฐ๋ท ์ ์์ด ๊ฐ๋ฅํ ์ธ๋ด ์ง์ญ์ ์ฌ์ฉ์๋, ํฐ๋์ ์ง์ ํ๋ ๊ธฐ์ฐจ ์์ ํต๊ทผ์๋ฅผ ์๊ฐํด ๋ณด์ญ์์ค. ํ์ ๊ฐ๋ก์ฑ๊ธฐ๊ฐ ์๋ค๋ฉด, ๊ทธ๋ค์ ๋ธ๋ผ์ฐ์ง ๊ฒฝํ์ ๊ณ์ํด์ ์ค๋จ๋ ๊ฒ์ ๋๋ค. ํ์ ๊ฐ๋ก์ฑ๊ธฐ๊ฐ ์๋ค๋ฉด, ์ด์ ์ ๋ฐฉ๋ฌธํ๋ ํ์ด์ง๋ ์ฌ์ง์ด ๋ฏธ๋ฆฌ ์บ์๋ ์ฝํ ์ธ ๊ฐ ์ํํ๊ฒ ์ ๊ณต๋์ด ์ฐ์์ฑ๊ณผ ์ฌ์ฉ์ ๋ง์กฑ๋๋ฅผ ์ ์งํ ์ ์์ต๋๋ค. ์ด๋ฌํ ๊ธ๋ก๋ฒ ์ ์ฉ ๊ฐ๋ฅ์ฑ์ ์ค์ํ ์ด์ ์ ๋๋ค.
ํ์ด์ง ๋ก๋ ๊ฐ๋ก์ฑ๊ธฐ ์๋ ๋ฐฉ์: ๋จ๊ณ๋ณ ๊ฐ์ด๋
ํ์ด์ง ๋ก๋๋ฅผ ๊ฐ๋ก์ฑ๋ ๊ณผ์ ์ ์๋น์ค ์์ปค ์๋ช ์ฃผ๊ธฐ ๋ด์ ๋ช ๊ฐ์ง ์ฃผ์ ๋จ๊ณ๋ฅผ ํฌํจํฉ๋๋ค:
1. ๋ฑ๋ก ๋ฐ ์ค์น
์ฌ์ ์ ์๋น์ค ์์ปค๋ฅผ ๋ฑ๋กํ๋ ๊ฒ์์ ์์๋ฉ๋๋ค. ์ด๋ ํด๋ผ์ด์ธํธ ์ธก์ ๋ฉ์ธ JavaScript ํ์ผ(์: app.js)์์ ์ํ๋ฉ๋๋ค:
if ('serviceWorker' in navigator) {
window.addEventListener('load', () => {
navigator.serviceWorker.register('/service-worker.js')
.then(registration => {
console.log('Service Worker registered with scope:', registration.scope);
})
.catch(error => {
console.error('Service Worker registration failed:', error);
});
});
}
๋ฑ๋ก๋๋ฉด ๋ธ๋ผ์ฐ์ ๋ ์๋น์ค ์์ปค ์คํฌ๋ฆฝํธ(service-worker.js)๋ฅผ ๋ค์ด๋ก๋ํ๊ณ ์ค์นํ๋ ค๊ณ ์๋ํฉ๋๋ค. install ์ด๋ฒคํธ ๋์, ์๋น์ค ์์ปค๋ ์ผ๋ฐ์ ์ผ๋ก ์ ํ๋ฆฌ์ผ์ด์
์
ธ์ ํ์์ ์ธ ์ ์ ์์ฐ์ ์บ์ํฉ๋๋ค:
self.addEventListener('install', event => {
event.waitUntil(
caches.open('my-app-cache-v1')
.then(cache => {
return cache.addAll([
'/',
'/index.html',
'/styles/main.css',
'/scripts/app.js',
'/images/logo.png'
]);
})
);
});
์ด "์ฌ์ ์บ์ฑ"์ ํต์ฌ UI ์์ฐ์ ์ฆ์ ์ฌ์ฉํ ์ ์๊ฒ ํ์ฌ, ์ฒซ ํ์ด์ง ๋ก๋์กฐ์ฐจ๋ ์ด๋ ์ ๋์ ์คํ๋ผ์ธ ๊ธฐ๋ฅ์ ํ์ฉํ ์ ์๋๋ก ๋ณด์ฅํฉ๋๋ค. ์ด๋ ์คํ๋ผ์ธ ์ฐ์ ์ ๋ต์ ํฅํ ๊ทผ๋ณธ์ ์ธ ๋จ๊ณ์ ๋๋ค.
2. ํ์ฑํ ๋ฐ ๋ฒ์ ์ ์ด
์ค์น ํ, ์๋น์ค ์์ปค๋ activate ๋จ๊ณ์ ๋ค์ด๊ฐ๋๋ค. ์ด๋๋ ์ค๋๋ ์บ์๋ฅผ ์ ๋ฆฌํ๊ณ ์๋ก์ด ์๋น์ค ์์ปค๊ฐ ํ์ด์ง๋ฅผ ์ ์ดํ๋๋ก ํ๋ ์ข์ ๊ธฐํ์
๋๋ค. clients.claim() ๋ฉ์๋๋ ์ฌ๊ธฐ์ ๋งค์ฐ ์ค์ํฉ๋๋ค. ์ด ๋ฉ์๋๋ฅผ ์ฌ์ฉํ๋ฉด ์๋ก ํ์ฑํ๋ ์๋น์ค ์์ปค๊ฐ ํ์ด์ง ์๋ก๊ณ ์นจ ์์ด๋ ์ฆ์ ์์ ์ ๋ฒ์ ๋ด ๋ชจ๋ ํด๋ผ์ด์ธํธ๋ฅผ ์ ์ดํ ์ ์๊ฒ ๋ฉ๋๋ค.
self.addEventListener('activate', event => {
event.waitUntil(
caches.keys().then(cacheNames => {
return Promise.all(
cacheNames.filter(cacheName => {
return cacheName.startsWith('my-app-cache-') && cacheName !== 'my-app-cache-v1';
}).map(cacheName => {
return caches.delete(cacheName);
})
);
}).then(() => self.clients.claim())
);
});
์๋น์ค ์์ปค์ "๋ฒ์(scope)"๋ ์น์ฌ์ดํธ์ ์ด๋ ๋ถ๋ถ์ ์ ์ดํ ์ ์๋์ง๋ฅผ ์ ์ํฉ๋๋ค. ๊ธฐ๋ณธ์ ์ผ๋ก ์๋น์ค ์์ปค ํ์ผ์ด ์์นํ ๋๋ ํ ๋ฆฌ์ ๊ทธ ๋ชจ๋ ํ์ ๋๋ ํ ๋ฆฌ์
๋๋ค. ํ์ ๊ฐ๋ก์ฑ๊ธฐ๋ฅผ ์ํด์๋, ์ฌ์ดํธ์ ๋ชจ๋ ํ์ด์ง์ ๋ํ ์์ฒญ์ ๊ฐ๋ก์ฑ ์ ์๋๋ก ์๋น์ค ์์ปค๋ฅผ ๋๋ฉ์ธ์ ๋ฃจํธ(์: /service-worker.js)์ ๋ฐฐ์นํ๋ ๊ฒ์ด ์ผ๋ฐ์ ์
๋๋ค.
3. Fetch ์ด๋ฒคํธ์ ํ์ ์์ฒญ
์ฌ๊ธฐ์ ๋ง๋ฒ์ด ์ผ์ด๋ฉ๋๋ค. ํ์ฑํ๋์ด ํ์ด์ง๋ฅผ ์ ์ดํ๊ฒ ๋๋ฉด, ์๋น์ค ์์ปค๋ fetch ์ด๋ฒคํธ๋ฅผ ์์ ๋๊ธฐํฉ๋๋ค. ๋ธ๋ผ์ฐ์ ๊ฐ HTML ํ์ด์ง, CSS ํ์ผ, ์ด๋ฏธ์ง, API ํธ์ถ ๋ฑ ๋ฆฌ์์ค๋ฅผ ์์ฒญํ ๋๋ง๋ค ์๋น์ค ์์ปค๋ ์ด ์์ฒญ์ ๊ฐ๋ก์ฑ๋๋ค:
self.addEventListener('fetch', event => {
console.log('Intercepting request for:', event.request.url);
// ์์ฒญ์ ์ฒ๋ฆฌํ๋ ๋ก์ง์ด ์ฌ๊ธฐ์ ๋ค์ด๊ฐ๋๋ค
});
ํนํ ํ์ ์์ฒญ(์ฆ, ์ฌ์ฉ์๊ฐ ์ ํ์ด์ง๋ฅผ ๋ก๋ํ๋ ค๊ณ ํ ๋)์ ๋์์ผ๋ก ํ๋ ค๋ฉด request.mode ์์ฑ์ ํ์ธํ ์ ์์ต๋๋ค:
self.addEventListener('fetch', event => {
if (event.request.mode === 'navigate') {
// ์ด๊ฒ์ ํ์ ์์ฒญ์ด๋ฏ๋ก ํน๋ณํ๊ฒ ์ฒ๋ฆฌํฉ๋๋ค
console.log('Navigation request:', event.request.url);
event.respondWith(
// ์ปค์คํ
์๋ต ๋ก์ง
);
}
// ๋ค๋ฅธ ์ ํ์ ์์ฒญ ์ฒ๋ฆฌ (์: 'no-cors', 'cors', 'same-origin')
});
request.mode๊ฐ 'navigate'์ผ ๋, ์ด๋ ๋ธ๋ผ์ฐ์ ๊ฐ ์๋ก์ด ํ์ ์ปจํ
์คํธ๋ฅผ ์ํด HTML ๋ฌธ์๋ฅผ ๊ฒ์ํ๋ ค๊ณ ์๋ํ๊ณ ์์์ ๋ํ๋
๋๋ค. ์ด๊ฒ์ด ๋ฐ๋ก ์ปค์คํ
ํ์ด์ง ๋ก๋ ๊ฐ๋ก์ฑ๊ธฐ ๋ก์ง์ ๊ตฌํํ ์ ์๋ ์ ํํ ์๊ฐ์
๋๋ค.
4. ํ์ ์์ฒญ์ ์๋ตํ๊ธฐ
ํ์ ์์ฒญ์ด ๊ฐ๋ก์ฑ์ง๋ฉด, ์๋น์ค ์์ปค๋ event.respondWith()๋ฅผ ์ฌ์ฉํ์ฌ ์ปค์คํ
์๋ต์ ์ ๊ณตํฉ๋๋ค. ์ฌ๊ธฐ์ ์บ์ฑ ์ ๋ต์ ๊ตฌํํฉ๋๋ค. ํ์ ์์ฒญ์ ๋ํ ์ผ๋ฐ์ ์ธ ์ ๋ต์ "์บ์ ์ฐ์ , ๋คํธ์ํฌ ๋์ฒด" ๋๋ ๋์ ์บ์ฑ๊ณผ ๊ฒฐํฉ๋ "๋คํธ์ํฌ ์ฐ์ , ์บ์ ๋์ฒด"์
๋๋ค:
self.addEventListener('fetch', event => {
if (event.request.mode === 'navigate') {
event.respondWith(async function() {
const cache = await caches.open('my-app-dynamic-cache-v1');
try {
const networkResponse = await fetch(event.request);
// ์๋ต์ ๋ณต์ฌ๋ณธ์ ์บ์์ ๋ฃ๊ณ ์๋ต์ ๋ฐํํฉ๋๋ค
event.waitUntil(cache.put(event.request, networkResponse.clone()));
return networkResponse;
} catch (error) {
// ๋คํธ์ํฌ ์์ฒญ ์คํจ, ์บ์์์ ๊ฐ์ ธ์ค๊ธฐ ์๋
const cachedResponse = await cache.match(event.request);
if (cachedResponse) {
return cachedResponse;
} else {
// ์บ์์ ์๋ฌด๊ฒ๋ ์์ผ๋ฉด ์คํ๋ผ์ธ ํ์ด์ง๋ก ๋์ฒด
return caches.match('/offline.html');
}
}
}());
}
});
์ด ์๋ ์คํ๋ผ์ธ ํ์ด์ง ๋์ฒด ๊ธฐ๋ฅ์ด ์๋ "๋คํธ์ํฌ ์ฐ์ , ์บ์ ๋์ฒด" ์ ๋ต์ ๋ณด์ฌ์ค๋๋ค. ๋คํธ์ํฌ๋ฅผ ์ฌ์ฉํ ์ ์์ผ๋ฉด ์ต์ ์ฝํ ์ธ ๋ฅผ ๊ฐ์ ธ์ต๋๋ค. ๊ทธ๋ ์ง ์์ผ๋ฉด ์บ์๋ ๋ฒ์ ์ผ๋ก ๋์ฒดํฉ๋๋ค. ๋ ๋ค ์ฌ์ฉํ ์ ์๋ ๊ฒฝ์ฐ ์ผ๋ฐ ์คํ๋ผ์ธ ํ์ด์ง๋ฅผ ์ ๊ณตํฉ๋๋ค. ์ด๋ฌํ ๋ณต์๋ ฅ์ ๋ค์ํ ๋คํธ์ํฌ ์กฐ๊ฑด์ ๊ฐ์ง ์ ์ธ๊ณ ์ฌ์ฉ์์๊ฒ ๊ฐ์ฅ ์ค์ํฉ๋๋ค.
์๋ต ์คํธ๋ฆผ์ ํ ๋ฒ๋ง ์๋น๋ ์ ์์ผ๋ฏ๋ก, ์๋ต์ ์บ์์ ๋ฃ์ ๋ clone() ๋ฉ์๋๋ฅผ ๊ณ ๋ คํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค. ๋ธ๋ผ์ฐ์ ๋ก ๋ณด๋ด๊ธฐ ์ํด ํ ๋ฒ ์๋นํ๋ฉด, ์บ์์ ์ ์ฅํ๊ธฐ ์ํด ๋ณต์ ๋ณธ์ด ํ์ํฉ๋๋ค.
ํ์ด์ง ๋ก๋ ๊ฐ๋ก์ฑ๊ธฐ์ ์ฃผ์ ์ฌ์ฉ ์ฌ๋ก ๋ฐ ์ด์
ํ์ด์ง ๋ก๋๋ฅผ ๊ฐ๋ก์ฑ ์ ์๋ ๋ฅ๋ ฅ์ ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ํฅ์์ํค๊ธฐ ์ํ ์๋ง์ ๊ฐ๋ฅ์ฑ์ ์ด์ด์ค๋๋ค:
์ฆ๊ฐ์ ์ธ ๋ก๋ฉ๊ณผ ์คํ๋ผ์ธ ์ฐ์
์ด๊ฒ์ ์๋ง๋ ๊ฐ์ฅ ์ํฅ๋ ฅ ์๋ ์ด์ ์ผ ๊ฒ์ ๋๋ค. ์ด์ ์ ๋ฐฉ๋ฌธํ ํ์ด์ง์ HTML๊ณผ ๊ด๋ จ ๋ฆฌ์์ค(CSS, JavaScript, ์ด๋ฏธ์ง)๋ฅผ ์บ์ฑํจ์ผ๋ก์จ, ํ์ ๋ฐฉ๋ฌธ์ ๋คํธ์ํฌ๋ฅผ ์์ ํ ์ฐํํ ์ ์์ต๋๋ค. ์๋น์ค ์์ปค๋ ์ฆ์ ์บ์๋ ๋ฒ์ ์ ์ ๊ณตํ์ฌ ๊ฑฐ์ ์ฆ๊ฐ์ ์ธ ํ์ด์ง ๋ก๋๋ฅผ ์ด๋์ด๋ ๋๋ค. ์ธํฐ๋ท์ด ๋๋ฆฌ๊ฑฐ๋ ๋ถ์์ ํ ์ง์ญ(์ ์ธ๊ณ์ ์ผ๋ก ๋ง์ ์ ํฅ ์์ฅ์์ ํํจ)์ ์ฌ์ฉ์์๊ฒ ์ด๊ฒ์ ๋ต๋ตํ ๊ธฐ๋ค๋ฆผ์ ์ํํ ๊ฒฝํ์ผ๋ก ๋ฐ๊ฟ๋๋ค. "์คํ๋ผ์ธ ์ฐ์ " ์ ๊ทผ ๋ฐฉ์์ ์ฌ์ฉ์๊ฐ ์์ ํ ์ฐ๊ฒฐ์ด ๋๊ฒผ์ ๋๋ ์ ํ๋ฆฌ์ผ์ด์ ์ด ๊ณ์ ๊ธฐ๋ฅํ๋๋ก ํ์ฌ, ์ด๋์๋ ์ง์ ์ผ๋ก ์ ๊ทผ ๊ฐ๋ฅํ๊ฒ ๋ง๋ญ๋๋ค.
์ต์ ํ๋ ๋ฆฌ์์ค ์ ๋ฌ ๋ฐ ๋์ญํญ ์ ์ฝ
๋คํธ์ํฌ ์์ฒญ์ ๋ํ ์ธ๋ฐํ ์ ์ด๋ฅผ ํตํด ์๋น์ค ์์ปค๋ ์ ๊ตํ ์บ์ฑ ์ ๋ต์ ๊ตฌํํ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด, ๋ชจ๋ฐ์ผ ์ฅ์น๋ฅผ ์ํด ๋ ์๊ณ ์ต์ ํ๋ ์ด๋ฏธ์ง๋ฅผ ์ ๊ณตํ๊ฑฐ๋, ์ค์ํ์ง ์์ ์์ฐ์ ๋ก๋ฉ์ ํ์ํ ๋๊น์ง ์ง์ฐ์ํฌ ์ ์์ต๋๋ค. ์ด๋ ์ด๊ธฐ ํ์ด์ง ๋ก๋ ์๋๋ฅผ ๋์ผ ๋ฟ๋ง ์๋๋ผ ๋์ญํญ ์๋น๋ฅผ ํฌ๊ฒ ์ค์ฌ์ฃผ๋ฉฐ, ์ด๋ ๋ฐ์ดํฐ ์๊ธ์ ์ ์ ํ์ด ์๊ฑฐ๋ ๋ฐ์ดํฐ ๋น์ฉ์ด ๋น์ผ ์ง์ญ์ ์ฌ์ฉ์์๊ฒ ์ค์ํ ๊ด์ฌ์ฌ์ ๋๋ค. ์บ์๋ ๋ฆฌ์์ค๋ฅผ ์ง๋ฅ์ ์ผ๋ก ์ ๊ณตํจ์ผ๋ก์จ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ ๊ฒฝ์ ์ ์ด๊ณ ๋ ๋์ ๊ธ๋ก๋ฒ ์ฌ์ฉ์์๊ฒ ์ ๊ทผ ๊ฐ๋ฅํด์ง๋๋ค.
๊ฐ์ธํ๋ ์ฌ์ฉ์ ๊ฒฝํ ๋ฐ ๋์ ์ฝํ ์ธ
์๋น์ค ์์ปค๋ ๋์ ์ฝํ ์ธ ๋ฅผ ์บ์ํ๊ณ ์คํ๋ผ์ธ ์ํ์์๋ ๊ฐ์ธํ๋ ๊ฒฝํ์ ์ ๊ณตํ ์ ์์ต๋๋ค. ์ฌ์ฉ์์ ์ต๊ทผ ๊ฒ์ ๊ธฐ๋ก์ด๋ ์์๋ฆฌ์คํธ๋ฅผ ์บ์ํ๋ ์ ์์๊ฑฐ๋ ์ฌ์ดํธ๋ฅผ ์์ํด ๋ณด์ญ์์ค. ์ฌ์ฉ์๊ฐ ๋ค์ ๋ฐฉ๋ฌธํ์ ๋, ์คํ๋ผ์ธ ์ํ๋ผ๋ ์ด ๊ฐ์ธํ๋ ์ฝํ ์ธ ๋ฅผ ์ฆ์ ํ์ํ ์ ์์ต๋๋ค. ์จ๋ผ์ธ ์ํ์ผ ๋, ์๋น์ค ์์ปค๋ ๋ฐฑ๊ทธ๋ผ์ด๋์์ ์ด ์ฝํ ์ธ ๋ฅผ ์ ๋ฐ์ดํธํ์ฌ ์ ์ฒด ํ์ด์ง ์๋ก๊ณ ์นจ ์์ด ์ ์ ํ ๊ฒฝํ์ ์ ๊ณตํ ์ ์์ต๋๋ค. ์ด๋ฌํ ์์ค์ ๋์ ์บ์ฑ๊ณผ ๊ฐ์ธํ๋ ์ ๋ฌ์ ์ฐธ์ฌ๋์ ์ฌ์ฉ์ ๋ง์กฑ๋๋ฅผ ํฅ์์ํต๋๋ค.
A/B ํ ์คํธ ๋ฐ ๋์ ์ฝํ ์ธ ์ ๋ฌ
์๋น์ค ์์ปค๋ A/B ํ ์คํธ๋ ๋์ ์ฝํ ์ธ ์ฃผ์ ์ ์ํ ๊ฐ๋ ฅํ ๋๊ตฌ๋ก ์ฌ์ฉ๋ ์ ์์ต๋๋ค. ํน์ ํ์ด์ง์ ๋ํ ํ์ ์์ฒญ์ ๊ฐ๋ก์ฑ์, ์๋น์ค ์์ปค๋ ์ฌ์ฉ์ ์ธ๊ทธ๋จผํธ, ์คํ ID ๋๋ ๊ธฐํ ๊ธฐ์ค์ ๋ฐ๋ผ ๋ค๋ฅธ ๋ฒ์ ์ HTML์ ์ ๊ณตํ๊ฑฐ๋ ํน์ ์คํฌ๋ฆฝํธ๋ฅผ ์ฃผ์ ํ ์ ์์ต๋๋ค. ์ด๋ฅผ ํตํด ์๋ฒ ์ธก ๋ฆฌ๋๋ ์ ์ด๋ ๋คํธ์ํฌ ์ํ์ ์ํด ์ง์ฐ๋ ์ ์๋ ๋ณต์กํ ํด๋ผ์ด์ธํธ ์ธก ๋ก์ง์ ์์กดํ์ง ์๊ณ ๋ ์๋ก์ด ๊ธฐ๋ฅ์ด๋ ์ฝํ ์ธ ๋ฅผ ์ํํ๊ฒ ํ ์คํธํ ์ ์์ต๋๋ค. ์ด๋ ๊ธ๋ก๋ฒ ํ์ด ์ ๋ฐํ ์ ์ด๋ฅผ ํตํด ๊ธฐ๋ฅ์ ์ถ์ํ๊ณ ํ ์คํธํ ์ ์๊ฒ ํด์ค๋๋ค.
๊ฐ๋ ฅํ ์ค๋ฅ ์ฒ๋ฆฌ ๋ฐ ๋ณต์๋ ฅ
๋ฆฌ์์ค๋ ํ์ด์ง ๋ก๋์ ์คํจํ์ ๋ ์ผ๋ฐ์ ์ธ ๋ธ๋ผ์ฐ์ ์ค๋ฅ ํ์ด์ง๋ฅผ ํ์ํ๋ ๋์ , ์๋น์ค ์์ปค๋ ์ค๋ฅ๋ฅผ ๊ฐ๋ก์ฑ๊ณ ์ฐ์ํ๊ฒ ์๋ตํ ์ ์์ต๋๋ค. ์ด๋ ์ปค์คํ ์คํ๋ผ์ธ ํ์ด์ง๋ฅผ ์ ๊ณตํ๊ฑฐ๋, ์น์ ํ ์ค๋ฅ ๋ฉ์์ง๋ฅผ ํ์ํ๊ฑฐ๋, ์ฝํ ์ธ ์ ๋์ฒด ๋ฒ์ ์ ์ ์ํ๋ ๊ฒ์ ํฌํจํ ์ ์์ต๋๋ค. ์ด๋ฌํ ๋ณต์๋ ฅ์ ํนํ ๋คํธ์ํฌ ์์ ์ฑ์ด ๋ณด์ฅ๋์ง ์๋ ํ๊ฒฝ์์ ์ ๋ฌธ์ ์ด๊ณ ์ ๋ขฐํ ์ ์๋ ์ฌ์ฉ์ ๊ฒฝํ์ ์ ์งํ๋ ๋ฐ ์ค์ํฉ๋๋ค.
์๋น์ค ์์ปค ํ์ ๊ฐ๋ก์ฑ๊ธฐ ๊ตฌํํ๊ธฐ
์ด์ ๊ฐ๋ ฅํ ํ์ ๊ฐ๋ก์ฑ๊ธฐ ๋ก์ง์ ๋ง๋ค๊ธฐ ์ํ ์ค์ ์ ์ธ ๊ตฌํ ์ธก๋ฉด๊ณผ ๋ชจ๋ฒ ์ฌ๋ก์ ๋ํด ๋ ๊น์ด ์์๋ณด๊ฒ ์ต๋๋ค.
๊ธฐ๋ณธ ๊ตฌ์กฐ ๋ฐ ๋์ฒด ๋ฐฉ์
ํ์์ ์ํ ์ผ๋ฐ์ ์ธ fetch ์ด๋ฒคํธ ๋ฆฌ์ค๋๋ ์์ฒญ ๋ชจ๋๋ฅผ ํ์ธํ ๋ค์ ๋คํธ์ํฌ์์ ๊ฐ์ ธ์ค๊ธฐ๋ฅผ ์๋ํ๊ณ , ์บ์๋ก ๋์ฒดํ๊ณ , ๋ง์ง๋ง์ผ๋ก ์ผ๋ฐ ์คํ๋ผ์ธ ํ์ด์ง๋ก ๋์ฒดํ๋ ๊ณผ์ ์ ํฌํจํฉ๋๋ค.
self.addEventListener('fetch', event => {
if (event.request.mode === 'navigate') {
event.respondWith(async function() {
const CACHE_NAME = 'app-shell-cache';
const OFFLINE_URL = '/offline.html'; // ์ด ํ์ด์ง๊ฐ ์ฌ์ ์บ์๋์๋์ง ํ์ธ
try {
const preloadResponse = await event.preloadResponse; // Chrome ์ ์ฉ
if (preloadResponse) {
return preloadResponse; // ์ฌ์ ๋ก๋๋ ์๋ต์ด ์์ผ๋ฉด ์ฌ์ฉ
}
const networkResponse = await fetch(event.request);
// ์๋ต์ด ์ ํจํ์ง ํ์ธ (์: 404/500์ด ์๋), ๊ทธ๋ ์ง ์์ผ๋ฉด ์๋ชป๋ ํ์ด์ง๋ฅผ ์บ์ํ์ง ์์
if (networkResponse && networkResponse.status === 200) {
const cache = await caches.open(CACHE_NAME);
cache.put(event.request, networkResponse.clone()); // ์ ํจํ ํ์ด์ง ์บ์
}
return networkResponse; // ๋คํธ์ํฌ ์๋ต ๋ฐํ
} catch (error) {
console.log('Fetch failed, returning offline page or cache:', error);
const cachedResponse = await caches.match(event.request);
if (cachedResponse) {
return cachedResponse; // ์บ์๋ ํ์ด์ง๊ฐ ์์ผ๋ฉด ๋ฐํ
}
return caches.match(OFFLINE_URL); // ์ผ๋ฐ ์คํ๋ผ์ธ ํ์ด์ง๋ก ๋์ฒด
}
}());
}
// ํ์์ด ์๋ ์์ฒญ์ ๊ฒฝ์ฐ ๋ค๋ฅธ ์บ์ฑ ์ ๋ต ๊ตฌํ (์: ์์ฐ์ ๋ํ ์บ์ ์ฐ์ )
});
์ด ํจํด์ ์ต์ ์ฑ๊ณผ ๋ณต์๋ ฅ ์ฌ์ด์ ์ข์ ๊ท ํ์ ์ ๊ณตํฉ๋๋ค. preloadResponse ๊ธฐ๋ฅ(Chrome ๋ฐ ๊ธฐํ Chromium ๊ธฐ๋ฐ ๋ธ๋ผ์ฐ์ ์์ ์ฌ์ฉ ๊ฐ๋ฅ)์ ์๋น์ค ์์ปค์ fetch ํธ๋ค๋ฌ๊ฐ ์คํ๋๊ธฐ ์ ์ ๋ฆฌ์์ค๋ฅผ ๋ฏธ๋ฆฌ ๋ก๋ํ์ฌ ํ์์ ๋์ฑ ์ต์ ํํ๊ณ ์ฒด๊ฐ ๋๊ธฐ ์๊ฐ์ ์ค์ผ ์ ์์ต๋๋ค.
ํ์์ ์ํ ์บ์ฑ ์ ๋ต
์ฌ๋ฐ๋ฅธ ์บ์ฑ ์ ๋ต์ ์ ํํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค. ํ์ ์์ฒญ์๋ ๋ค์๊ณผ ๊ฐ์ ์ ๋ต์ด ์ผ๋ฐ์ ์ผ๋ก ์ฌ์ฉ๋ฉ๋๋ค:
-
์บ์ ์ฐ์ , ๋คํธ์ํฌ ๋์ฒด(Cache First, Network Fallback): ์ด ์ ๋ต์ ์๋๋ฅผ ์ฐ์ ์ํฉ๋๋ค. ์๋น์ค ์์ปค๋ ๋จผ์ ์บ์๋ฅผ ํ์ธํฉ๋๋ค. ์ผ์นํ๋ ํญ๋ชฉ์ด ๋ฐ๊ฒฌ๋๋ฉด ์ฆ์ ์ ๊ณต๋ฉ๋๋ค. ๊ทธ๋ ์ง ์์ผ๋ฉด ๋คํธ์ํฌ๋ก ๋์ฒด๋ฉ๋๋ค. ์ด๋ ์์ฃผ ๋ณ๊ฒฝ๋์ง ์๋ ์ฝํ
์ธ ๋ ์คํ๋ผ์ธ ์ก์ธ์ค๊ฐ ๊ฐ์ฅ ์ค์ํ ๊ฒฝ์ฐ์ ์ด์์ ์
๋๋ค. ์๋ฅผ ๋ค์ด, ๋ฌธ์ ํ์ด์ง๋ ์ ์ ๋ง์ผํ
์ฝํ
์ธ ์
๋๋ค.
event.respondWith(caches.match(event.request).then(response => { return response || fetch(event.request).catch(() => caches.match('/offline.html')); })); -
๋คํธ์ํฌ ์ฐ์ , ์บ์ ๋์ฒด(Network First, Cache Fallback): ์ด ์ ๋ต์ ์ต์ ์ฑ์ ์ฐ์ ์ํฉ๋๋ค. ์๋น์ค ์์ปค๋ ๋จผ์ ๋คํธ์ํฌ์์ ๊ฐ์ ธ์ค๋ ค๊ณ ์๋ํฉ๋๋ค. ์ฑ๊ณตํ๋ฉด ํด๋น ์๋ต์ด ์ฌ์ฉ๋๊ณ ์ ์ฌ์ ์ผ๋ก ์บ์๋ฉ๋๋ค. ๋คํธ์ํฌ ์์ฒญ์ด ์คํจํ๋ฉด(์: ์คํ๋ผ์ธ์ผ๋ก ์ธํด) ์บ์๋ก ๋์ฒด๋ฉ๋๋ค. ์ด๋ ๋ด์ค ๊ธฐ์ฌ๋ ๋์ ์ฌ์ฉ์ ํผ๋์ ๊ฐ์ด ๊ฐ๋ฅํ ํ ์ต์ ์ํ์ฌ์ผ ํ๋ ์ฝํ
์ธ ์ ์ ํฉํฉ๋๋ค.
event.respondWith(fetch(event.request).then(networkResponse => { caches.open('dynamic-pages').then(cache => cache.put(event.request, networkResponse.clone())); return networkResponse; }).catch(() => caches.match(event.request).then(cachedResponse => cachedResponse || caches.match('/offline.html')))); -
Stale-While-Revalidate: ํ์ด๋ธ๋ฆฌ๋ ์ ๊ทผ ๋ฐฉ์์
๋๋ค. ์บ์์์ ์ฝํ
์ธ (์ค๋๋ ์ฝํ
์ธ )๋ฅผ ์ฆ์ ์ ๊ณตํ๋ ๋์์ ๋ฐฑ๊ทธ๋ผ์ด๋์์ ๋คํธ์ํฌ ์์ฒญ์ ํ์ฌ ์ต์ ์ฝํ
์ธ ๋ฅผ ๊ฐ์ ธ์ต๋๋ค. ๋คํธ์ํฌ ์์ฒญ์ด ์๋ฃ๋๋ฉด ์บ์๊ฐ ์
๋ฐ์ดํธ๋ฉ๋๋ค. ์ด๋ ๋ฐ๋ณต ๋ฐฉ๋ฌธ ์ ์ฆ๊ฐ์ ์ธ ๋ก๋ฉ์ ์ ๊ณตํ๋ฉด์ ์ฝํ
์ธ ๊ฐ ๊ฒฐ๊ตญ ์ต์ ์ํ๊ฐ ๋๋๋ก ๋ณด์ฅํฉ๋๋ค. ์ด๋ ๋ธ๋ก๊ทธ, ์ ํ ๋ชฉ๋ก ๋๋ ์๋๊ฐ ์ค์ํ์ง๋ง ์ต์ข
์ ์ธ ์ต์ ์ฑ๋ ์ํ๋ ๋ค๋ฅธ ์ฝํ
์ธ ์ ํ์ํฉ๋๋ค.
event.respondWith(caches.open('content-cache').then(cache => { return cache.match(event.request).then(cachedResponse => { const networkFetch = fetch(event.request).then(networkResponse => { cache.put(event.request, networkResponse.clone()); return networkResponse; }); return cachedResponse || networkFetch; }); })); -
์บ์ ์ ์ฉ(Cache Only): ์ด ์ ๋ต์ ์บ์์์๋ง ์ฝํ
์ธ ๋ฅผ ์๊ฒฉํ๊ฒ ์ ๊ณตํ๊ณ ์ ๋ ๋คํธ์ํฌ๋ก ๊ฐ์ง ์์ต๋๋ค. ์ผ๋ฐ์ ์ผ๋ก ์ค์น ์ค์ ์ฌ์ ์บ์๋๊ณ ์์ฃผ ๋ณ๊ฒฝ๋ ๊ฒ์ผ๋ก ์์๋์ง ์๋ ์ ํ๋ฆฌ์ผ์ด์
์
ธ ์์ฐ์ ์ฌ์ฉ๋ฉ๋๋ค.
event.respondWith(caches.match(event.request));
์ ๋ต์ ์ ํ์ ์ ๊ณต๋๋ ์ฝํ ์ธ ์ ํน์ ์๊ตฌ ์ฌํญ๊ณผ ์ํ๋ ์ฌ์ฉ์ ๊ฒฝํ์ ๋ฐ๋ผ ํฌ๊ฒ ๋ฌ๋ผ์ง๋๋ค. ๋ง์ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ด๋ฌํ ์ ๋ต์ ์กฐํฉํ์ฌ ์ค์ํ ์ ธ ์์ฐ์๋ "์บ์ ์ ์ฉ"์, ์์ฃผ ์ ๋ฐ์ดํธ๋๋ ์ฝํ ์ธ ์๋ "stale-while-revalidate"๋ฅผ, ๋งค์ฐ ๋์ ์ธ ๋ฐ์ดํฐ์๋ "๋คํธ์ํฌ ์ฐ์ "์ ์ฌ์ฉํฉ๋๋ค.
๋น-HTML ์์ฒญ ์ฒ๋ฆฌ
์ด ๊ธฐ์ฌ๋ ํ์(HTML) ์์ฒญ์ ์ค์ ์ ๋์ง๋ง, fetch ํธ๋ค๋ฌ๊ฐ ์ด๋ฏธ์ง, CSS, JavaScript, ๊ธ๊ผด ๋ฐ API ํธ์ถ์ ๋ํ ์์ฒญ๋ ๊ฐ๋ก์ฑ๋ค๋ ์ ์ ๊ธฐ์ตํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค. ์ด๋ฌํ ๋ฆฌ์์ค ์ ํ์ ๋ํด ๋ณ๋์ ์ ์ ํ ์บ์ฑ ์ ๋ต์ ๊ตฌํํด์ผ ํฉ๋๋ค. ์๋ฅผ ๋ค์ด, ์ด๋ฏธ์ง ๋ฐ ๊ธ๊ผด๊ณผ ๊ฐ์ ์ ์ ์์ฐ์๋ "์บ์ ์ฐ์ " ์ ๋ต์ ์ฌ์ฉํ๊ณ , API ๋ฐ์ดํฐ์ ๋ณ๋์ฑ์ ๋ฐ๋ผ "๋คํธ์ํฌ ์ฐ์ " ๋๋ "stale-while-revalidate"๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค.
์ ๋ฐ์ดํธ ๋ฐ ๋ฒ์ ๊ด๋ฆฌ ์ฒ๋ฆฌ
์๋น์ค ์์ปค๋ ์ฐ์ํ๊ฒ ์
๋ฐ์ดํธ๋๋๋ก ์ค๊ณ๋์์ต๋๋ค. ์๋ก์ด ๋ฒ์ ์ service-worker.js ํ์ผ์ ๋ฐฐํฌํ๋ฉด ๋ธ๋ผ์ฐ์ ๋ ๋ฐฑ๊ทธ๋ผ์ด๋์์ ๋ค์ด๋ก๋ํฉ๋๋ค. ์ด์ ๋ฒ์ ์ด ์ฌ์ ํ ํด๋ผ์ด์ธํธ๋ฅผ ์ ์ดํ๊ณ ์๋ค๋ฉด ์ฆ์ ํ์ฑํ๋์ง ์์ต๋๋ค. ์ ๋ฒ์ ์ ์ด์ ์๋น์ค ์์ปค๋ฅผ ์ฌ์ฉํ๋ ๋ชจ๋ ํญ์ด ๋ซํ ๋๊น์ง "๋๊ธฐ ์ค" ์ํ๋ก ์์ต๋๋ค. ๊ทธ๋์ผ๋ง ์ ์๋น์ค ์์ปค๊ฐ ํ์ฑํ๋์ด ์ ์ด๊ถ์ ๊ฐ๊ฒ ๋ฉ๋๋ค.
activate ์ด๋ฒคํธ ๋์, ์ค๋๋ ์ฝํ
์ธ ๊ฐ ์ ๊ณต๋๋ ๊ฒ์ ๋ฐฉ์งํ๊ณ ๋์คํฌ ๊ณต๊ฐ์ ์ ์ฝํ๊ธฐ ์ํด ์ค๋๋ ์บ์๋ฅผ ์ ๋ฆฌํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค(์ ์์ ์ฐธ์กฐ). ์ ์ ํ ์บ์ ๋ฒ์ ๊ด๋ฆฌ(์: 'my-app-cache-v1', 'my-app-cache-v2')๋ ์ด ์ ๋ฆฌ ๊ณผ์ ์ ๋จ์ํํฉ๋๋ค. ๊ธ๋ก๋ฒ ๋ฐฐํฌ์ ๊ฒฝ์ฐ, ์
๋ฐ์ดํธ๊ฐ ํจ์จ์ ์ผ๋ก ์ ํ๋๋๋ก ํ๋ ๊ฒ์ด ์ผ๊ด๋ ์ฌ์ฉ์ ๊ฒฝํ์ ์ ์งํ๊ณ ์๋ก์ด ๊ธฐ๋ฅ์ ์ถ์ํ๋ ๋ฐ ์ค์ํฉ๋๋ค.
๊ณ ๊ธ ์๋๋ฆฌ์ค ๋ฐ ๊ณ ๋ ค ์ฌํญ
๊ธฐ๋ณธ ์ฌํญ์ ๋์ด, ์๋น์ค ์์ปค ํ์ ๊ฐ๋ก์ฑ๊ธฐ๋ ํจ์ฌ ๋ ์ ๊ตํ ๋์์ ์ํด ํ์ฅ๋ ์ ์์ต๋๋ค.
์ฌ์ ์บ์ฑ ๋ฐ ์์ธก ๋ก๋ฉ
์๋น์ค ์์ปค๋ ๋ฐฉ๋ฌธํ ํ์ด์ง๋ฅผ ์บ์ฑํ๋ ๊ฒ์ ๋์ด์ค ์ ์์ต๋๋ค. ์์ธก ๋ก๋ฉ์ ์ฌ์ฉํ๋ฉด ์ฌ์ฉ์ ํ๋์ ๋ถ์ํ๊ฑฐ๋ ๋จธ์ ๋ฌ๋์ ์ฌ์ฉํ์ฌ ์ฌ์ฉ์๊ฐ ๋ค์์ ๋ฐฉ๋ฌธํ ํ์ด์ง๋ฅผ ์์ธกํ ์ ์์ต๋๋ค. ๊ทธ๋ฌ๋ฉด ์๋น์ค ์์ปค๋ ๋ฐฑ๊ทธ๋ผ์ด๋์์ ์ด๋ฌํ ํ์ด์ง๋ฅผ ์ฌ์ ์ ๋ฏธ๋ฆฌ ์บ์ํ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด, ์ฌ์ฉ์๊ฐ ํ์ ๋งํฌ ์์ ๋ง์ฐ์ค๋ฅผ ์ฌ๋ฆฌ๋ฉด ์๋น์ค ์์ปค๋ ํด๋น ํ์ด์ง์ HTML ๋ฐ ์์ฐ ๊ฐ์ ธ์ค๊ธฐ๋ฅผ ์์ํ ์ ์์ต๋๋ค. ์ด๋ ๊ฒ ํ๋ฉด *๋ค์* ํ์์ด ์ฆ๊ฐ์ ์ผ๋ก ๋๊ปด์ ธ ์ ์ธ๊ณ ์ฌ์ฉ์์ ์ฒด๊ฐ ๋๊ธฐ ์๊ฐ์ ์ต์ํํ์ฌ ๋๋๋๋ก ๋ถ๋๋ฌ์ด ์ฌ์ฉ์ ๊ฒฝํ์ ๋ง๋ญ๋๋ค.
๋ผ์ฐํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ (Workbox)
fetch ์ด๋ฒคํธ ํธ๋ค๋ฌ์ ์บ์ฑ ์ ๋ต์ ์๋์ผ๋ก ๊ด๋ฆฌํ๋ ๊ฒ์ ํนํ ๋๊ท๋ชจ ์ ํ๋ฆฌ์ผ์ด์
์ ๊ฒฝ์ฐ ๋ณต์กํด์ง ์ ์์ต๋๋ค. Google์ Workbox๋ ์ด๋ฌํ ๋ณต์ก์ฑ์ ์๋น ๋ถ๋ถ์ ์ถ์ํํ์ฌ ์ผ๋ฐ์ ์ธ ์๋น์ค ์์ปค ํจํด์ ๋ํ ๊ณ ์์ค API๋ฅผ ์ ๊ณตํ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ธํธ์
๋๋ค. Workbox๋ ๋ค์ํ ์์ฒญ ์ ํ(์: ํ์, ์ด๋ฏธ์ง, API ํธ์ถ)์ ๋ํ ๋ผ์ฐํ
์ ๊ตฌํํ๊ณ ์ต์ํ์ ์ฝ๋๋ก ๋ค์ํ ์บ์ฑ ์ ๋ต์ ์ ์ฉํ๋ ๊ฒ์ ๋ ์ฝ๊ฒ ๋ง๋ญ๋๋ค. ์ค์ ์ ํ๋ฆฌ์ผ์ด์
์ ์ ๊ทน ๊ถ์ฅ๋๋ฉฐ, ๊ฐ๋ฐ์ ๋จ์ํํ๊ณ ์ ์ฌ์ ์ธ ์ค๋ฅ๋ฅผ ์ค์ฌ ๋๊ท๋ชจ ๊ฐ๋ฐํ๊ณผ ์ฌ๋ฌ ์ง์ญ์ ๊ฑธ์น ์ผ๊ด๋ ๋ฐฐํฌ์ ์ ์ฉํฉ๋๋ค.
import { registerRoute } from 'workbox-routing';
import { NetworkFirst, CacheFirst } from 'workbox-strategies';
import { CacheableResponsePlugin } from 'workbox-cacheable-response';
import { ExpirationPlugin } from 'workbox-expiration';
// ๋คํธ์ํฌ ์ฐ์ ์ ๋ต์ผ๋ก HTML ํ์ ์์ฒญ ์บ์
registerRoute(
({ request }) => request.mode === 'navigate',
new NetworkFirst({
cacheName: 'html-pages',
plugins: [
new CacheableResponsePlugin({
statuses: [200]
}),
new ExpirationPlugin({
maxAgeSeconds: 60 * 60 * 24 * 7, // 1์ฃผ
}),
],
})
);
// ์บ์ ์ฐ์ ์ ๋ต์ผ๋ก ์ ์ ์์ฐ ์บ์
registerRoute(
({ request }) => request.destination === 'style' ||
request.destination === 'script' ||
request.destination === 'image',
new CacheFirst({
cacheName: 'static-assets',
plugins: [
new CacheableResponsePlugin({
statuses: [200]
}),
new ExpirationPlugin({
maxAgeSeconds: 60 * 60 * 24 * 30, // 30์ผ
maxEntries: 50,
}),
],
})
);
์ด Workbox ์๋ ๋ผ์ฐํ ๊ท์น๊ณผ ์บ์ฑ ์ ๋ต์ ์ผ๋ง๋ ๋ช ํํ๊ณ ๊ฐ๊ฒฐํ๊ฒ ์ ์ํ ์ ์๋์ง๋ฅผ ๋ณด์ฌ์ฃผ๋ฉฐ, ๊ธ๋ก๋ฒ ํ๋ก์ ํธ์ ์ ์ง ๊ด๋ฆฌ์ฑ์ ํฅ์์ํต๋๋ค.
์ฌ์ฉ์ ๊ฒฝํ: ๋ก๋ฉ ํ์๊ธฐ ๋ฐ ์ ธ ์ฑ ๋ชจ๋ธ
์๋น์ค ์์ปค ์ต์ ํ๋ฅผ ์ฌ์ฉํ๋๋ผ๋ ์ผ๋ถ ์ฝํ ์ธ ๋ ์ฌ์ ํ ๋คํธ์ํฌ์์ ๊ฐ์ ธ์์ผ ํ ์ ์์ต๋๋ค. ์ด๋ฌํ ์๊ฐ์๋ ์ฌ์ฉ์์๊ฒ ์๊ฐ์ ํผ๋๋ฐฑ์ ์ ๊ณตํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค. ๊ธฐ๋ณธ UI(ํค๋, ํธํฐ, ํ์)๊ฐ ์ฆ์ ์บ์์์ ์ ๊ณต๋๊ณ ๋์ ์ฝํ ์ธ ๊ฐ ์ ์๋ฆฌ์ ๋ก๋๋๋ "์ ธ ์ฑ" ๋ชจ๋ธ์ ๋ถ๋๋ฌ์ด ์ ํ์ ๋ง๋ญ๋๋ค. ๋ก๋ฉ ์คํผ๋, ์ค์ผ๋ ํค ์คํฌ๋ฆฐ ๋๋ ์งํ๋ฅ ํ์์ค์ ์ฝํ ์ธ ๊ฐ ์ค๊ณ ์์์ ํจ๊ณผ์ ์ผ๋ก ์ ๋ฌํ์ฌ ์ฒด๊ฐ ๋๊ธฐ ์๊ฐ์ ์ค์ด๊ณ ๋ค์ํ ์ฌ์ฉ์์ธต์ ๋ง์กฑ๋๋ฅผ ํฅ์์ํฌ ์ ์์ต๋๋ค.
์๋น์ค ์์ปค ๋๋ฒ๊น
์๋น์ค ์์ปค๋ ๋ฐฑ๊ทธ๋ผ์ด๋ ํน์ฑ ๋๋ฌธ์ ๋๋ฒ๊น ์ด ์ด๋ ค์ธ ์ ์์ต๋๋ค. ๋ธ๋ผ์ฐ์ ๊ฐ๋ฐ์ ๋๊ตฌ(์: Chrome DevTools์ "Application" ํญ)๋ ๋ฑ๋ก๋ ์๋น์ค ์์ปค, ์ํ, ์บ์ ๋ฐ ๊ฐ๋ก์ฑ ๋คํธ์ํฌ ์์ฒญ์ ๊ฒ์ฌํ๊ธฐ ์ํ ํฌ๊ด์ ์ธ ๋๊ตฌ๋ฅผ ์ ๊ณตํฉ๋๋ค. ์ด๋ฌํ ๋๊ตฌ๋ฅผ ํจ๊ณผ์ ์ผ๋ก ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ ์ดํดํ๋ ๊ฒ์ ํนํ ๋ณต์กํ ์บ์ฑ ๋ก์ง์ด๋ ์ ์ธ๊ณ์ ์ผ๋ก ๋ฐ์ํ๋ ๋ค์ํ ๋คํธ์ํฌ ์กฐ๊ฑด ๋๋ ๋ธ๋ผ์ฐ์ ์์ ์๊ธฐ์น ์์ ๋์์ ์ฒ๋ฆฌํ ๋ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ๋ฐ ์ค์ํฉ๋๋ค.
๋ณด์ ์ํฅ
์๋น์ค ์์ปค๋ HTTPS(๋๋ ๊ฐ๋ฐ ์ค localhost)์์๋ง ์๋ํฉ๋๋ค. ์ด๋ ์ ์์ ์ธ ํ์์๊ฐ ์์ฒญ์ด๋ ์๋ต์ ๊ฐ๋ก์ฑ๊ณ ์กฐ์ํ๋ ๊ฒ์ ๋ฐฉ์งํ๊ธฐ ์ํ ์ค์ํ ๋ณด์ ์กฐ์น์ ๋๋ค. ์ฌ์ดํธ๊ฐ HTTPS๋ฅผ ํตํด ์ ๊ณต๋๋๋ก ํ๋ ๊ฒ์ ์๋น์ค ์์ปค ์ฑํ์ ์ํ ํ์ ์ ์ ์กฐ๊ฑด์ด๋ฉฐ ๋ชจ๋ ํ๋ ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ชจ๋ฒ ์ฌ๋ก๋ก, ์ ์ธ๊ณ์ ์ผ๋ก ์ฌ์ฉ์ ๋ฐ์ดํฐ์ ๋ฌด๊ฒฐ์ฑ์ ๋ณดํธํฉ๋๋ค.
๊ธ๋ก๋ฒ ๋ฐฐํฌ์ ๊ณผ์ ์ ๋ชจ๋ฒ ์ฌ๋ก
๋งค์ฐ ๊ฐ๋ ฅํ์ง๋ง, ์๋น์ค ์์ปค ํ์ ๊ฐ๋ก์ฑ๊ธฐ๋ฅผ ๊ตฌํํ๋ ๋ฐ๋ ํนํ ๋ค์ํ ๊ธ๋ก๋ฒ ์ฌ์ฉ์๋ฅผ ๋์์ผ๋ก ํ ๋ ๊ณ ์ ํ ๊ณผ์ ๊ฐ ๋ฐ๋ฆ ๋๋ค.
๋ณต์ก์ฑ๊ณผ ํ์ต ๊ณก์
์๋น์ค ์์ปค๋ ํ๋ก ํธ์๋ ๊ฐ๋ฐ์ ์๋ก์ด ๋ณต์ก์ฑ ๊ณ์ธต์ ๋์ ํฉ๋๋ค. ์๋ช ์ฃผ๊ธฐ, ์ด๋ฒคํธ ๋ชจ๋ธ, ์บ์ฑ API ๋ฐ ๋๋ฒ๊น ๊ธฐ์ ์ ์ดํดํ๋ ค๋ฉด ์๋นํ ํ์ต ํฌ์๊ฐ ํ์ํฉ๋๋ค. ๋ค์ํ ์์ฒญ ์ ํ ๋ฐ ์ฃ์ง ์ผ์ด์ค(์: ์ค๋๋ ์ฝํ ์ธ , ๋คํธ์ํฌ ์คํจ, ์บ์ ๋ฌดํจํ)๋ฅผ ์ฒ๋ฆฌํ๋ ๋ก์ง์ ๋ณต์กํด์ง ์ ์์ต๋๋ค. Workbox์ ๊ฐ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ํ์ฉํ๋ฉด ์ด๋ฅผ ์ํํ ์ ์์ง๋ง, ํจ๊ณผ์ ์ธ ๊ตฌํ ๋ฐ ๋ฌธ์ ํด๊ฒฐ์ ์ํด์๋ ์๋น์ค ์์ปค ๊ธฐ๋ณธ ์ฌํญ์ ๋ํ ํ์คํ ์ดํด๊ฐ ์ฌ์ ํ ํ์์ ์ ๋๋ค.
ํ ์คํธ ๋ฐ ํ์ง ๋ณด์ฆ
์ฒ ์ ํ ํ ์คํธ๋ ๊ฐ์ฅ ์ค์ํฉ๋๋ค. ์๋น์ค ์์ปค๋ ๋ ํนํ ํ๊ฒฝ์์ ์๋ํ๋ฏ๋ก ํฌ๊ด์ ์ผ๋ก ํ ์คํธํ๊ธฐ ์ด๋ ต์ต๋๋ค. ๋ค์ํ ๋คํธ์ํฌ ์กฐ๊ฑด(์จ๋ผ์ธ, ์คํ๋ผ์ธ, ๋๋ฆฐ 3G, ๋ถ์์ ํ Wi-Fi), ๋ค์ํ ๋ธ๋ผ์ฐ์ , ๊ทธ๋ฆฌ๊ณ ๋ค์ํ ์๋น์ค ์์ปค ์ํ(์ฒซ ๋ฐฉ๋ฌธ, ์ฌ๋ฐฉ๋ฌธ, ์ ๋ฐ์ดํธ ์๋๋ฆฌ์ค)์์ ์ ํ๋ฆฌ์ผ์ด์ ์ ํ ์คํธํด์ผ ํฉ๋๋ค. ์ด๋ ์ข ์ข ์ ๋ฌธ ํ ์คํธ ๋๊ตฌ์ ์ ๋ต์ ํ์๋ก ํ๋ฉฐ, ์๋น์ค ์์ปค ๋ก์ง์ ๋ํ ๋จ์ ํ ์คํธ์ ๋ค์ํ ๋คํธ์ํฌ ์กฐ๊ฑด ํ์์ ์ค์ ์ฌ์ฉ์ ์ฌ์ ์ ์๋ฎฌ๋ ์ด์ ํ๋ ์๋ํฌ์๋ ํ ์คํธ๋ฅผ ํฌํจํ์ฌ ์ ์ธ๊ณ ์ธํฐ๋ท ์ธํ๋ผ์ ๊ฐ๋ณ์ฑ์ ๊ณ ๋ คํด์ผ ํฉ๋๋ค.
๋ธ๋ผ์ฐ์ ์ง์ ๋ฐ ์ ์ง์ ํฅ์
์๋น์ค ์์ปค ์ง์์ ์ต์ ๋ธ๋ผ์ฐ์ ์ ๋ฐ์ ๋๋ฆฌ ํผ์ ธ ์์ง๋ง, ๊ตฌํ ๋ธ๋ผ์ฐ์ ๋ ๋ ์ผ๋ฐ์ ์ธ ๋ธ๋ผ์ฐ์ ๋ ์ง์ํ์ง ์์ ์ ์์ต๋๋ค. ์ ์ง์ ํฅ์ ์ ๊ทผ ๋ฐฉ์์ ์ฑํํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค. ์ฆ, ์ ํ๋ฆฌ์ผ์ด์
์ ์๋น์ค ์์ปค ์์ด๋ ์์ฉ ๊ฐ๋ฅํ๊ฒ ์๋ํด์ผ ํ๋ฉฐ, ๊ฐ๋ฅํ ๊ฒฝ์ฐ ์๋น์ค ์์ปค๋ฅผ ํ์ฉํ์ฌ ํฅ์๋ ๊ฒฝํ์ ์ ๊ณตํด์ผ ํฉ๋๋ค. ์๋น์ค ์์ปค ๋ฑ๋ก ํ์ธ('serviceWorker' in navigator)์ ์ฒซ ๋ฒ์งธ ๋ฐฉ์ด์ ์ผ๋ก, ์ ๋ฅํ ๋ธ๋ผ์ฐ์ ๋ง ์ฌ์ฉํ๋๋ก ๋ณด์ฅํฉ๋๋ค. ์ด๋ ๊ธฐ์ ์คํ์ ๊ด๊ณ์์ด ๋ชจ๋ ์ฌ์ฉ์์ ์ ๊ทผ์ฑ์ ๋ณด์ฅํฉ๋๋ค.
์บ์ ๋ฌดํจํ ๋ฐ ๋ฒ์ ๊ด๋ฆฌ ์ ๋ต
์๋ชป ๊ด๋ฆฌ๋ ์บ์ฑ ์ ๋ต์ ์ฌ์ฉ์๊ฐ ์ค๋๋ ์ฝํ
์ธ ๋ฅผ ๋ณด๊ฑฐ๋ ์ค๋ฅ๋ฅผ ๊ฒช๊ฒ ํ ์ ์์ต๋๋ค. ๊ฐ๋ ฅํ ์บ์ ๋ฌดํจํ ๋ฐ ๋ฒ์ ๊ด๋ฆฌ ์ ๋ต์ ๊ฐ๋ฐํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค. ์ฌ๊ธฐ์๋ ์ค์ํ ๋ฐฐํฌ๋ง๋ค ์บ์ ์ด๋ฆ์ ์ฆ๊ฐ์ํค๊ณ , ์ค๋๋ ์บ์๋ฅผ ์ ๋ฆฌํ๊ธฐ ์ํด activate ์ด๋ฒคํธ ํธ๋ค๋ฌ๋ฅผ ๊ตฌํํ๋ฉฐ, ์ ์ฌ์ ์ผ๋ก ์๋น์ค ์์ปค ๋ก์ง๊ณผ ํจ๊ป ์๋ฒ ์ธก ์ ์ด๋ฅผ ์ํด `Cache-Control` ํค๋์ ๊ฐ์ ๊ณ ๊ธ ๊ธฐ์ ์ ์ฌ์ฉํ๋ ๊ฒ์ด ํฌํจ๋ฉ๋๋ค. ๊ธ๋ก๋ฒ ์ ํ๋ฆฌ์ผ์ด์
์ ๊ฒฝ์ฐ, ์ ์ํ๊ณ ์ผ๊ด๋ ์บ์ ์
๋ฐ์ดํธ๋ฅผ ๋ณด์ฅํ๋ ๊ฒ์ด ํตํฉ๋๊ณ ์ ์ ํ ๊ฒฝํ์ ์ ๊ณตํ๋ ํต์ฌ์
๋๋ค.
์ฌ์ฉ์์๊ฒ ๋ช ํํ ์์ฌ์ํต
์ ํ๋ฆฌ์ผ์ด์ ์ด ๊ฐ์๊ธฐ ์คํ๋ผ์ธ์์ ์๋ํ๋ฉด, ์ ๋๋ก ์ ๋ฌ๋์ง ์์ผ๋ฉด ์ฆ๊ฑฐ์ด ๋๋ผ์์ด๊ฑฐ๋ ํผ๋์ค๋ฌ์ด ๊ฒฝํ์ด ๋ ์ ์์ต๋๋ค. ๋คํธ์ํฌ ์ํ๋ ์คํ๋ผ์ธ ๊ธฐ๋ฅ์ ๋ํ๋ด๋ ๋ฏธ๋ฌํ UI ๋จ์๋ฅผ ์ ๊ณตํ๋ ๊ฒ์ ๊ณ ๋ คํ์ญ์์ค. ์๋ฅผ ๋ค์ด, "์คํ๋ผ์ธ ์ํ์ด๋ฉฐ, ์บ์๋ ์ฝํ ์ธ ๋ฅผ ํ์ ์ค์ ๋๋ค"๋ฅผ ๋ํ๋ด๋ ์์ ๋ฐฐ๋๋ ์์ด์ฝ์ ํนํ ์น ํ๋์ ๋ํ ๊ธฐ๋๊ฐ ๋ค๋ฅผ ์ ์๋ ๋ค์ํ ๋ฌธํ์ ๋งฅ๋ฝ์์ ์ฌ์ฉ์ ์ดํด์ ์ ๋ขฐ๋ฅผ ํฌ๊ฒ ํฅ์์ํฌ ์ ์์ต๋๋ค.
๊ธ๋ก๋ฒ ์ํฅ ๋ฐ ์ ๊ทผ์ฑ
์๋น์ค ์์ปค ํ์ ๊ฐ๋ก์ฑ๊ธฐ์ ์๋ฏธ๋ ํนํ ๊ธ๋ก๋ฒ ์ฌ์ฉ์์๊ฒ ์ฌ์คํฉ๋๋ค. ์ธ๊ณ ์ฌ๋ฌ ์ง์ญ์์ ๋ชจ๋ฐ์ผ ์ฐ์ ์ฌ์ฉ์ด ์ง๋ฐฐ์ ์ด๋ฉฐ, ๋คํธ์ํฌ ์กฐ๊ฑด์ ๋์ ์ค์ฌ๋ถ์ ๊ณ ์ 5G์์ ๋์ด ์ง์ญ์ ๊ฐํ์ ์ธ 2G์ ์ด๋ฅด๊ธฐ๊น์ง ๋งค์ฐ ๋ค์ํ ์ ์์ต๋๋ค. ์คํ๋ผ์ธ ์ก์ธ์ค๋ฅผ ๊ฐ๋ฅํ๊ฒ ํ๊ณ ํ์ด์ง ๋ก๋๋ฅผ ํฌ๊ฒ ๊ฐ์ํํจ์ผ๋ก์จ, ์๋น์ค ์์ปค๋ ์ ๋ณด ๋ฐ ์๋น์ค์ ๋ํ ์ ๊ทผ์ ๋ฏผ์ฃผํํ์ฌ ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ชจ๋ ์ฌ๋์๊ฒ ๋ ํฌ๊ด์ ์ด๊ณ ์ ๋ขฐํ ์ ์๊ฒ ๋ง๋ญ๋๋ค.
์๋น์ค ์์ปค๋ ์น์ ๋คํธ์ํฌ ์์กด์ ์ธ ๋งค์ฒด์์ ์ฐ๊ฒฐ ์ํ์ ๊ด๊ณ์์ด ํต์ฌ ๊ธฐ๋ฅ์ ์ ๊ณตํ ์ ์๋ ๋ณต์๋ ฅ ์๋ ํ๋ซํผ์ผ๋ก ๋ณํํฉ๋๋ค. ์ด๊ฒ์ ๋จ์ํ ๊ธฐ์ ์ ์ต์ ํ๊ฐ ์๋๋ผ, ๋๋ฅ๊ณผ ๋ค์ํ ์ฌํ ๊ฒฝ์ ์ ํ๊ฒฝ์ ๊ฑธ์ณ ์๋ ์ฌ์ฉ์๋ฅผ ์ํ ๋ ์ ๊ทผ์ฑ ์๊ณ ๊ณตํํ ์น ๊ฒฝํ์ ํฅํ ๊ทผ๋ณธ์ ์ธ ๋ณํ์ ๋๋ค.
๊ฒฐ๋ก
ํ๋ก ํธ์๋ ์๋น์ค ์์ปค ํ์ ๊ฐ๋ก์ฑ๊ธฐ๋ ์น ๊ฐ๋ฐ์ ์ค์ถ์ ์ธ ๋ฐ์ ์ ๋ํ๋ ๋๋ค. ์ง๋ฅ์ ์ด๊ณ ํ๋ก๊ทธ๋๋ฐ ๊ฐ๋ฅํ ํ๋ก์ ์ญํ ์ ํจ์ผ๋ก์จ ์๋น์ค ์์ปค๋ ๊ฐ๋ฐ์๊ฐ ๋คํธ์ํฌ ๊ณ์ธต์ ๋ํ ์ ๋ก ์๋ ์ ์ด๊ถ์ ๊ฐ๊ฒ ํ์ฌ, ์ ์ฌ์ ์ธ ๋คํธ์ํฌ ๋ถ์ฑ๋ฅผ ์ฑ๋ฅ๊ณผ ๋ณต์๋ ฅ์ ์ํ ์์ฐ์ผ๋ก ์ ํ์ํต๋๋ค. ํ์ด์ง ๋ก๋๋ฅผ ๊ฐ๋ก์ฑ๊ณ , ์บ์๋ ์ฝํ ์ธ ๋ฅผ ์ ๊ณตํ๋ฉฐ, ๊ฐ๋ ฅํ ์คํ๋ผ์ธ ๊ฒฝํ์ ์ ๊ณตํ๋ ๋ฅ๋ ฅ์ ๋ ์ด์ ํ์ ๊ธฐ๋ฅ์ด ์๋๋ผ, ์ ์ ๋ ์ฐ๊ฒฐ๋์ง๋ง ์ข ์ข ์ ๋ขฐํ ์ ์๋ ๊ธ๋ก๋ฒ ํ๊ฒฝ์์ ๊ณ ํ์ง ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ์ ๊ณตํ๊ธฐ ์ํ ์ค์ํ ์๊ตฌ ์ฌํญ์ ๋๋ค.
์๋น์ค ์์ปค๋ฅผ ์์ฉํ๊ณ ํ์ ๊ฐ๋ก์ฑ๊ธฐ๋ฅผ ๋ง์คํฐํ๋ ๊ฒ์ ๋จ์ง ๋๋ถ์๊ฒ ๋น ๋ฅผ ๋ฟ๋ง ์๋๋ผ ์ง์ ์ผ๋ก ์ฌ์ฉ์ ์ค์ฌ์ ์ด๊ณ , ์ ์ ๊ฐ๋ฅํ๋ฉฐ, ๋ณดํธ์ ์ผ๋ก ์ ๊ทผ ๊ฐ๋ฅํ ์น ๊ฒฝํ์ ๊ตฌ์ถํ๋ ๋ฐ ๋ํ ํฌ์์ ๋๋ค. ์ด ์ฌ์ ์ ์์ํ๋ฉด์ ์ ์ง์ ํฅ์, ์ฒ ์ ํ ํ ์คํธ, ๊ทธ๋ฆฌ๊ณ ์ฌ์ฉ์์ ์๊ตฌ์ ๋คํธ์ํฌ ์ปจํ ์คํธ์ ๋ํ ๊น์ ์ดํด๋ฅผ ์ฐ์ ์ํ๋ ๊ฒ์ ๊ธฐ์ตํ์ญ์์ค. ์น ์ฑ๋ฅ๊ณผ ์คํ๋ผ์ธ ๊ธฐ๋ฅ์ ๋ฏธ๋๋ ์ฌ๊ธฐ์ ์์ผ๋ฉฐ, ์๋น์ค ์์ปค๊ฐ ๊ทธ ์ ๋์ ์ ์์ต๋๋ค.